#ifndef __MUTEXSOCKETLIST_H__
#define __MUTEXSOCKETLIST_H__

/**
 * @file mutexsocketlist.h
 * @brief Librairie de liste chainée avec mutex.
 * @author Florian.B
 * @version 0.1
 * @date 4 avril 2012
 *
 * Librairie fournissant un gestionnaire de liste chainée avec des mutex pour
 * pallier au problème lecteur rédacteur.
 *
 */

#include <pthread.h>
#include "../list/list.h"
#include "../list/intlist.h"

/**
 * @struct MutexSocketList
 * @brief Objet MutexSocketList
 *
 * MutexSocketList est un petit objet qui permet de gerer une file par le biais
 * d'une liste en gérant les accès concurrents de lecteur rédacteur.
 */
typedef struct _MutexSocketList
{
  List fileSocket; /*!< La file contenant les donnnées. */
  pthread_mutex_t mutexAcces; /*!< Le mutex d'ajout ou de suppression d'une
    entrée. */
  pthread_cond_t condVide; /*!< La condition d'attente sur une liste vide. */
  int maxSocket; /*!< Le nombre de socket max dans la connexion. */
  int nbSocketConnect; /*!< Le nombre de socket en connexion. */
  int continu; /*!< Condition d’arrêt. */
}MutexSocketList;

/**
 * @enum MutexSocketListReturn
 * @brief Constantes de retour.
 *
 * MutexSocketListReturn est une série de constatnes prédéfinie pour diverses
 * futures fonctions de l'objet MutexSocketList.
 */
typedef enum
  {
    MUTEXSOCKETLIST_SUCCESS = 0, /*!< Succès. */
    MUTEXSOCKETLIST_YES = 0,
    MUTEXSOCKETLIST_NO = 1, /*!< Non. */
    MUTEXSOCKETLIST_MAX = -1, /*!< File remplie. */
    MUTEXSOCKETLIST_ERR = -2, /*!< Erreur. */
    MUTEXSOCKETLIST_END = -3, /*!< Fin de la connexion. */
    MUTEXSOCKETLIST_NB_RET /*!< Nombre total de constantes de retour. */
  }MutexSocketListReturn;

/**
 * @fn void initializes_MutexSocketList(MutexSocketList *mutexSocketList)
 * @brief Fonction d'initialisation d'un mutexSocketList.
 *
 * @param[in,out] mutexSocketList Mutex à initialiser.
 */
void initialize_MutexSocketList(MutexSocketList *mutexSocketList,
                                const int maxSocket);

/**
 * @fn void testament_Mutex(Mutex *mutex)
 * @brief Fonction de libération d'un mutexSocketList.
 *
 * @param[in,out] mutexSocketList MutexSocketList qui sera libérée.
 */
void testament_MutexSocketList(MutexSocketList *mutexSocketList);

/**
 * @fn MutexSocketListReturn insert_MutexSocketList(
 * MutexSocketList *mutexSocketList, const Element element);
 * @brief Fonction d'ajout en queue dans la liste.
 *
 * @param[in,out] mutexSocketList Le MutexSocketList qui prendra l'élément.
 * @param element L'élément à insérer.
 * @return MUTEX_SUCCESS pour le succès, MUTEXSOCKETLIST_MAX si il y a trop
 * d'élément dans la liste et MUTEXSOCKETLIST_ERR en cas d'erreur.
 */
MutexSocketListReturn insert_MutexSocketList(MutexSocketList *mutexSocketList,
                                             const Element element);

/**
 * @fn Element getFirst_MutexSocketList(MutexSocketList *mutexSocketList)
 * @brief Fonction qui retourne le premier élément de la liste et qui le
 * supprime de la liste.
 *
 * @param[in,out] mutexSocketList Le MutexSocketList qui retourne l'élément et
 * qui le supprime.
 * @return L'élément en tête de la liste ou NULL si la liste est vide
 */
int getFirst_MutexSocketList(MutexSocketList *mutexSocketList);

/**
 * @fn void notifyEnd_MutexSocketList(MutexSocketList *mutexSocketList)
 * @brief Fonction qui envoie à tous les threads qu'il faut terminer la
 * connexion.
 *
 * @param[in,out] mutexSocketList Le mutex de travail.
 */
void notifyEnd_MutexSocketList(MutexSocketList *mutexSocketList);

/**
 * @brief Ajoute une connexion.
 *
 * @param[in,out] mutexSocketList Le mutex de travail.
 */
void addConnection_MutexSocketList(MutexSocketList *mutexSocketList);

/**
 * @brief Supprime une connexion.
 *
 * @param[in,out] mutexSocketList Le mutex de travail.
 */
void subtractConnection_MutexSocketList(MutexSocketList *mutexSocketList);

/**
 * @brief Récupère le nombre de connexion.
 *
 * @param mutexSocketList Le mutex de travail.
 * @return Le nombre de connexion en cours.
 */
int isMaxConnected_MutexSocketList(MutexSocketList *mutexSocketList);

#endif
